#include "ModRunSingleton.h"
#include <QDebug>

#include "../Output/FactoryOutput.h"

#include "Gof23/Gof_Singleton/SingletonLhan.h"
#include "Gof23/Gof_Singleton/SingletonEhan.h"
#include "Gof23/Gof_Singleton/SingletonStatic.h"
#include "Gof23/Gof_Singleton/Singleton11.h"
#include "Gof23/Gof_Singleton/Singleton11T.h"

//单例模式的ModRun（Singleton）;
ModRunSingleton::ModRunSingleton()
{
    //模式名称;
    m_strModelName = "单例模式（Singleton）;";
    //模式描述;
    m_strModelDesc = "单例模式顾名思义，保证一个类仅可以有一个实例化对象，并且提供一个可以访问它的全局接口。实现单例模式必须注意一下几点："
                     "单例类只能有一个实例化对象。\r\n"
                     "单例类必须自己提供一个实例化对象。\r\n"
                     "单例类必须提供一个可以访问唯一实例化对象的接口。\r\n"
                     "单例模式分为懒汉,饿汉,双重检查锁，静态内部类单例（反射反序列化无法破解），枚举式单例，单例模板类。\r\n"
                     ;
}

//初始化显示模式;
void ModRunSingleton::InitDisplay()
{
    qDebug() << m_strModelName;
    std::shared_ptr<IOutput> pOutPut = FactoryOutput::GetInstance()->CreateDescOutput();
    if (pOutPut)
    {
        std::initializer_list<QString> outList{ m_strModelName,m_strModelDesc};
        pOutPut->OutPut(outList);
    }
}

//返回模式类型;
EnumModRun ModRunSingleton::GetEnum()
{
    return emModRunSingleton;
}

//运行模式;
void ModRunSingleton::ModRun()
{
    std::shared_ptr<IOutput> pOutPut = FactoryOutput::GetInstance()->CreateRunOutput();
    if (pOutPut)
    {
        std::initializer_list<QString> outListStart{ "========单例模式 start:=======" };
        std::initializer_list<QString> outListEnd{ "========单例模式 end:=======" };
        pOutPut->OutPut(outListStart);

        //单例模式;
        //饿汉式生成;
        SingletonEhan::GetInstance()->Display();
        SingletonEhan::GetInstance()->Display();

        //懒汉模式生成;
        SingletonLhan::GetInstance()->Display();
        SingletonLhan::GetInstance()->Display();

        //C++11版本实现;
        Singleton11::GetInstance()->Display();
        Singleton11::GetInstance()->Display();

        //静态类实现;
        SingletonStatic::GetInstance()->Display();
        SingletonStatic::GetInstance()->Display();

        //枚举类实现见百度-_-!;

        //C++11模板方式见其他类-_-!;

        pOutPut->OutPut(outListEnd);
    }

}

InterFaceModRun* ModRunSingleton::CreateMe()
{
    return new ModRunSingleton();
}
